package com.ybkj.daijia.server.event.listener;

import com.ybkj.daijia.PushDataV4;
import com.ybkj.daijia.Setting;
import com.ybkj.daijia.serverUtils.SettingUtils;
import com.ybkj.daijia.api.gexin.GeTuiEmployV4;
import com.ybkj.daijia.api.jpush.JiGuangEmployV4;
import com.ybkj.daijia.server.event.model.SysLowestWorkVirtualChangeEvent;
import com.ybkj.daijia.server.model.Company;
import com.ybkj.daijia.server.model.Driver;
import com.ybkj.daijia.server.service.CompanyService;
import com.ybkj.daijia.server.service.DriverService;
import com.ybkj.daijia.server.service.SmsTempletService;
import com.ybkj.daijia.server.websocket.WebSocketSend;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

@Component
public class SysLowestWorkVirtualChangeEventListener implements
    ApplicationListener<SysLowestWorkVirtualChangeEvent> {

    private static final Logger logger = LoggerFactory
        .getLogger(SysLowestWorkVirtualChangeEventListener.class);

    @Autowired
    private SmsTempletService smsTempletService;

    @Autowired
    private DriverService driverService;

    @Autowired
    private SettingUtils settingUtils;


    @Autowired
    private CompanyService companyService;


    @Override
    @Async
    public void onApplicationEvent(SysLowestWorkVirtualChangeEvent event) {

        logger.debug("sys SysLowestWorkVirtualChangeEvent event:{}", "");

        Setting setting = (Setting) event.getSource();

        List<Driver> drivers = driverService.listValid(null);

        if (!CollectionUtils.isEmpty(drivers)) {

            for (Driver driver : drivers) {

                if (driver.getStatus().equals(Driver.DRIVER_ONLINE)
                    && driver.getType().equals(Driver.DRIVER_TYPR_PARTTIME)
                    && setting.getLowestWorkVirtual() != 0
                    && driver.getVirtual().doubleValue() < setting.getLowestWorkVirtual()) {

                    driver.setStatus(Driver.DRIVER_OFFLINE);
                    driverService.updateStatus(Driver.DRIVER_OFFLINE, driver.getId());

                    JSONObject jsonObject = new JSONObject();
                    jsonObject.put("type", "driverPowerOffline");
                    jsonObject.put("driverID", driver.getId());
                    jsonObject.put("driverName", driver.getName());
                    jsonObject.put("lastStatus", Driver.DRIVER_ONLINE);
                    Company mainCompany = companyService.getMain();

                    Company driverCompany = companyService.findOne(driver.getCompanyId());
                    WebSocketSend.boardcastToArea(jsonObject, driverCompany.getCityName(),
                        mainCompany.getId());

                    try {

                        PushDataV4 pushDataV4 = new PushDataV4();
                        pushDataV4.setCode("0X07");
                        Map<String, String> extra = new HashMap<String, String>();
                        extra.put("content", "您已被强制下线");
                        pushDataV4.setExtra(extra);

                        boolean getuiOnline = false;
                        if (StringUtils.isNotBlank(driver.getUserID())) {
                            getuiOnline = GeTuiEmployV4
                                .getClientOnline(driver.getUserID(), settingUtils.get());
                        }

                        if (getuiOnline) {
                            GeTuiEmployV4.push(driver, pushDataV4, settingUtils.get());
                        } else {
                            if (StringUtils.isNotBlank(driver.getRegistrationId())) {
                                JiGuangEmployV4.push(driver, pushDataV4, settingUtils.get());
                            }
                        }

                    } catch (IOException e) {
                        logger.debug("push error : " + e.getMessage());
                    }

                }


            }

        }


    }

}
